#ifndef LOADER_H
#define LOADER_H

#include "comm/boot_info.h"
#include "comm/types.h"
#include "comm/cpu_instr.h"

#define PAMS 0x534d4150     //签名"PAMS"的ASCII编码（Physical Address Mapping Structure）
#define SELECTOR_CODE 0x0008    //代码段选择子
#define SELECTOR_DATA 0x0010    //数据段选择子

extern boot_info_t boot_info;

/*
 * 保护模式入口
 */
void _protected_mode_entry(void);

typedef enum _SMAP_ENTRY_TYPE {
    OS_USED = 1,    //操作系统可以使用和分配的内存
    USED = 2,       //已被系统使用或占用的内存
    ACPI = 3        //ACPI申领的内存
} SMAP_ENTRY_TYPE;

/*
E820功能地址范围描述结构
*/
typedef struct smap_entry {
    uint32_t base_l;    //物理基地址低32位
    uint32_t base_h;    //物理基地址高32位
    uint32_t length_l;    //内存块长度低32位
    uint32_t length_h;    //内存块长度低32位
    SMAP_ENTRY_TYPE type;
    uint32_t acpi;      // 扩展 bit 0=0时此条目忽略
}__attribute__((packed)) smap_entry_t;

#endif  // LOADER_H
